/**
 * 
 * @brief  rpmsg_modules.h
 * @param  None
 * 
 * @author xhq
 * @date   2024/11/05
 * 
 */
#ifndef __SRC_RPMSG_MODULES_H__
#define __SRC_RPMSG_MODULES_H__

/* include */
#include <errno.h>
#include <linux/rpmsg.h>

#include "ti_rpmsg_char.h"
#include "rproc_id.h"
#include "rpmsg_char_internal.h"
#include "global_variables.h"

/* define */
#define   REMOTE_ENDPT	                           14
#define   RPMSG_TIME_OUT                           200000

/* typedef */
typedef enum
{
    RPMSG_GET_DSP_VERSION               = 0x0101,        // 获取dsp程序版本号
    RPMSG_SET_DEBUG_PARAM               = 0x0102,        // 配置调试参数
    RPMSG_GET_DEBUG_PARAM               = 0x0103,        // 查询调试参数
    RPMSG_SET_DATA_PRO_ENABLE           = 0x0104,        // 配置数据处理使能, arm通知dsp进行数据处理
    RPMSG_SET_DATA_PRO_COMPLETE         = 0x0105,        // 配置数据处理完成， dsp通知arm数据处理完成
}rpmsg_cmd_etype;

/* 数据帧信息 */
typedef enum
{
    RPMSG_HEAD                          = 0xAAEE,        // 帧头
    RPMSG_TAIL                          = 0xFFEE,        // 帧尾
	RPMSG_CMD_PAGE_MAX                  = 1,             // 指令页数
	RPMSG_EXCHANGE_BUF_SIZE             = 384,           // 数据交换空间大小
	RPMSG_ADD_INFO_SIZE                 = 8,             // 附加信息长度（帧头到数据内容之间）
}rpmsg_config_info_etype;

/* 信号处理状态 */
typedef enum
{
    DSP_PRO_IDLE                      = 0,        // 空闲
    DSP_PRO_BUSY                      = 1,        // 忙
	DSP_PRO_COMPLETE                  = 2,        // 完成
    DSP_PRO_ABORT                     = 3,        // 异常/中止
}dsp_pro_status_etype;

typedef enum
{
    DSPPRO_TDM_TEST_NODE =1,
    DSPPRO_TDM_MODE,
    DSPPRO_TDM_DDM_PROXIMAL_MODE,       //近端
    DSPPRO_TDM_DDM_FAREND_MODE,         //远端
    DSPPRO_DDM_MODE,
    DSPPRO_MODE_MAX,
}bsp_dsppro_mode_etype;


/* rproc信息结构体 */
typedef struct 
{
    uint8_t recv_complete_flag;
	uint8_t rproc_id;           // 远程核心id
	uint8_t *dev_name;
	rpmsg_char_dev_t *rcdev;
}rproc_info_type;
/* rpmsg信息结构体 */
typedef struct 
{
	uint32_t remote_endpt;
	uint32_t local_endpt;
	rproc_info_type rproc_info[RPROC_ID_MAX];
}rpmsg_recv_protocol_info_type;

/* 配置指令结构体 */
typedef struct
{
    /* config info */
    struct
    {
        uint8_t  cmd_page_num;              // 参数页序号：0, 1, 2, ...
        uint8_t  data_pro_enable;           // 数据处理使能：0-失能，1：使能
        uint8_t  config_param_enable;       // 配置参数使能：0-失能，1：使能
        uint8_t  signal_pro_mode;           // 模式： 0：TDM，1：DDM
    }config_info;

    /* page 0*/
    struct
    {
        /* 调试参数1 */
        uint32_t dsp_debug_param1;

        /* 调试参数2 */
        uint32_t dsp_debug_param2;

        /* 调试参数3 */
        uint32_t dsp_debug_param3;

        /* 调试参数4 */
        uint32_t dsp_debug_param4;
    }rpmsg_page0_config_param;

}rpmsg_config_param_type;

/* 状态指令结构体 */
typedef struct
{
    /* status info */
    struct
    {
        uint8_t  cmd_page_num;                 // 参数页序号：0, 1, 2, ...
        uint8_t  data_pro_complete_flag;       // 数据处理完成标志位：0：空闲，1：忙，2：完成， 3：中止处理, 4:超时
        uint8_t  param_config_ret_code;        // 参数配置/查询返回代码：1：成功，2：失败，3：超时
        uint8_t  reserve2;
    }status_info;

    /* page 0 */
    struct
    {
        /* dsp程序版本号 */
        uint32_t  num:4;
        uint32_t  month:4;
        uint32_t  year:16;
        uint32_t  day:8;

        /* 调试参数1 */
        uint32_t dsp_debug_param1;

        /* 调试参数2 */
        uint32_t dsp_debug_param2;

        /* 调试参数3 */
        uint32_t dsp_debug_param3;

        /* 调试参数4 */
        uint32_t dsp_debug_param4;

        /* 存储目标信息的首地址 */
        uint32_t obj_info_addr;

    }rpmsg_page0_status_param;

    /* page 1 */
}rpmsg_status_param_type;

/* function */
uint32_t rpmsg_modules_init();
uint32_t rpmsg_modules_deinit();
rproc_info_type *get_rpmsg_rproc_info();
rpmsg_status_param_type *get_rpmsg_status_param();
rpmsg_config_param_type *get_rpmsg_config_param();
uint32_t update_rpmsg_config_param(rpmsg_config_param_type *l_rpmsg_config_param);

void *rpmsg_recv_protocol_thread();
void *rpmsg_send_protocol_thread();

/* 指令协议 */
uint32_t dsp_rpmsg_set_config_info(rproc_info_type * l_rproc_info, uint8_t l_u8_info_page_num);
uint32_t dsp_rpmsg_get_status_info(rproc_info_type * l_rproc_info, uint8_t *l_u8_recv_buf);
int32_t  dsp_rpmsg_set_data_pro_msg();

#endif
